#include <stdio.h>

// void f(int a[5]) // 形参，parameter
// void f(int a[ ]) // 形参，parameter
// void f(int  *a ) // a --> 1 (int)
// {

// }

// void f2(char   s[3] [5])
// void f2(char   s[ ] [5])
// void f2( char  (*s) [5]  ) // s --> "abcd" (char [5])
// {

// }

// void f3( double *   c[3]  [5] )
// void f3( double *   c[ ]  [5] )
void f3( double *   (*c)  [5] )
{
    // 将c看做是二维数组时的写法
    printf("%lf\n", *c[2][3] ); 

    // 将c看做是指针时的写法（最终也是跟数组写法等价）
    printf("%lf\n", *(*(&(*c) + 2))[3] );
    printf("%lf\n", *(*(c + 2))[3] ); // 取目标符*和取地址符&是一对互逆运算，相互抵消
    printf("%lf\n", *(c[2])[3] );
    printf("%lf\n", *c[2][3] );
}

int main(int argc, char const *argv[])
{
    // 1. 数组会被自动转化为指向首元素的指针
    //    例外：当出现sizeof、&的时候就不会转化
    // 2. a[i] <==> *(a+i)

    // int a[5] = {1,2,3,4,5};
    // f(a); // 实参，arguemnt
    // f(&a[0]);  // 此地址，是 int 这种数据的地址

    // char (s[3])   [5] = {  {"abcd"}   , {"xyxw"}   , {"0123"}   };
    // f2(s);
    // f2(&s[0]); // 此地址，是 char [5] 这种数据的地址

    // 数组的局部初始化
    int a[100] = { [3]=66, [8]=99, [10 ... 20]=123};

    double f = 3.14;
    double *c[3][5] = {  [2]={  [3]=&f } }; // 令c[2][3] = &f
    // f3(c);
    f3(&c[0]);  // 此地址，是  double *[5]（具有5个double*的数组）这种数据的地址

    return 0;
}
